package com.cctc.juc.source.Athread.threadpool;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

/**
 * [ScheduledExecutorService 可调度的线程池] 接口
 * 描述信息：该接口扩展自 ExecutorService [线程池] 接口，是一个可以完成 “延时” 和 “周期性” 任务的调度执行接口，其功能类似于 Timer / TimerTask。
 */
public interface FScheduledTExecutorService extends ExecutorService {
    /**
     * 按照提交顺序（FIFO）串行化（延迟）执行。
     * - 无返回值；
     * - 可以抛出异常信息，通过 ScheduledFuture 捕获异常。
     */
    public ScheduledFuture<?> schedule(Runnable task, long delay, TimeUnit unit);

    /**
     * 按照提交顺序（FIFO）串行化（延迟）执行。
     * - 有返回值，通过 ScheduledFuture 获取结果；
     * - 可以抛出异常信息，通过 ScheduledFuture 捕获异常。
     */
    public <V> ScheduledFuture<V> schedule(Callable<V> task, long delay, TimeUnit unit);

    /**
     * 按照（定频）固定速率（period）延迟一定时间（initialDelay）后重复执行。
     * - 无返回值；
     * - 可以抛出异常信息，通过 ScheduledFuture 捕获异常。
     * 适用场景：需要周期性执行的任务，例如 SpringBoot 中的任务调度器底层使用的就是这个接口。
     */
    public ScheduledFuture<?> scheduleAtFixedRate(Runnable task, long initialDelay, long period, TimeUnit unit);

    /**
     * 按照（定时）固定延迟（delay）延迟一定时间（initialDelay）后重复执行。
     * - 有返回值，通过 ScheduledFuture 获取结果；
     * - 可以抛出异常信息，通过 ScheduledFuture 捕获异常。
     */
    public ScheduledFuture<?> scheduleWithFixedDelay(Runnable task, long initialDelay, long delay, TimeUnit unit);
}
